/*
 * Copyright 2024 LinQingYing. and contributors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * The use of this source code is governed by the Apache License 2.0,
 * which allows users to freely use, modify, and distribute the code,
 * provided they adhere to the terms of the license.
 *
 * The software is provided "as-is", and the authors are not responsible for
 * any damages or issues arising from its use.
 *
 */

package com.linqingying.cangjie.ide.completion.keywords

import com.linqingying.cangjie.lexer.CjKeywordToken
import com.intellij.codeInsight.completion.CompletionParameters
import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.openapi.project.Project
//
//class BreakContinueKeywordHandler(keyword: CjKeywordToken) : CompletionKeywordHandler<CjAnalysisSession>(keyword) {
//    init {
//        check(keyword == CjTokens.BREAK_KEYWORD || keyword == CjTokens.CONTINUE_KEYWORD) {
//            "Keyword should be either `break` or `continue`. But was: $keyword"
//        }
//    }
//
//    context(CjAnalysisSession)
//    fun createLookups(expression: CjExpression?): Collection<LookupElement> {
//        if (expression == null) return emptyList()
//        val supportsNonLocalBreakContinue =
//            expression.languageVersionSettings.supportsFeature(LanguageFeature.BreakContinueInInlineLambdas)
//        return expression.parentsWithSelf
//            .takeWhile { it !is CjDeclarationWithBody || canDoNonLocalJump(it, supportsNonLocalBreakContinue) }
//            .filterIsInstance<CjLoopExpression>()
//            .flatMapIndexed { index: Int, loop: CjLoopExpression ->
//                listOfNotNull(
//                    if (index == 0) createKeywordElement(keyword.value) else null,
//                    (loop.parent as? CjLabeledExpression)?.getLabelNameAsName()?.let { label ->
//                        createKeywordElement(keyword.value, tail = label.labelNameToTail())
//                    }
//                )
//            }
//            .toList()
//    }
//    context(CjAnalysisSession)
//    private fun canDoNonLocalJump(
//        body: CjDeclarationWithBody,
//        supportsNonLocalBreakContinue: Boolean,
//    ) = supportsNonLocalBreakContinue &&
//            body is CjFunctionLiteral &&
//            isInlineFunctionCall(body.findLabelAndCall().second)
//
//    context(CjAnalysisSession)
//    override fun createLookups(
//        parameters: CompletionParameters,
//        expression: CjExpression?,
//        lookup: LookupElement,
//        project: Project
//    ): Collection<LookupElement> = createLookups(expression)
//}
//
//context(CjAnalysisSession)
//fun isInlineFunctionCall(call: CjCallExpression?): Boolean =
//    (call?.calleeExpression as? CjReferenceExpression)?.mainReference
//        ?.resolveToSymbol()
//        ?.let { it as? CjFunctionSymbol }
//        ?.isInline == true
